#include <iostream>
#include <thread> //c++提供的线程库
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
#include <cstdio>

using namespace std;

int tickets = 1000;

void *gettickets(void *args)
{
    (void)args;
    while (true)
    {
        if (tickets > 0)
        {
            usleep(1000);
            printf("%p: %d\n", pthread_self(), tickets);
            tickets--;
        }
        else
        {
            break;
        }
    }
    return nullptr;
}

int main()
{
    pthread_t t1, t2, t3;
    // 多线程抢票的逻辑
    pthread_create(&t1, nullptr, gettickets, nullptr);
    pthread_create(&t2, nullptr, gettickets, nullptr);
    pthread_create(&t3, nullptr, gettickets, nullptr);

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);

    return 0;
}

// void fun()
// {
//     while (true)
//     {
//         cout << "I am new thread" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t1(fun);//c++的线程库，底层也要调用原生线程库
//     std::thread t2(fun);
//     std::thread t3(fun);
//     std::thread t4(fun);

//     while (true)
//     {
//         cout << "main thread" << endl;
//         sleep(1);
//     }

//     t1.join();
//     return 0;
// }

//////////////////////////////////////////////////////////////////////////////////////////

// void *threadRun(void *args)
// {
//     const string name = (char *)args;
//     int count = 0;
//     while (true)
//     {
//         printf("I am %s,pid: %d,tid:%lu\n", name.c_str(), getpid(), pthread_self());
//         sleep(1);
//         pthread_cancel(pthread_self());

//         if (count++ == 10)
//             break;
//     }

//     // pthread_exit((void*)2);
//     //  return (void*)1; // 是返回给谁呢？一般是给main thread, main如何获取到呢？pthread_join
// }

// int main()
// {
//     //因为我们目前用的不是Linux自带的创建线程的接口，我们用的是pthread库中的接口！
//     pthread_t tid[5]; // 本质是一个地址！
//     char name[64];

//     for (int i = 0; i < 5; i++)
//     {
//         snprintf(name, sizeof name, "%s -%d", "thread", i);
//         pthread_create(tid+i, nullptr, threadRun, (void *)name);
//         sleep(1);//缓解传参bug
//     }

//      printf("main thread,pid: %d,tid:%lu\n",getpid(),pthread_self());
//     for(int i=0;i<5;i++)
//     {
//         int*ret=nullptr;//线程正常退出时的退出码，用于判断线程的运行结果是否正确
//         pthread_join(tid[i],(void**)&ret);// 默认会阻塞等待新线程退出
//         printf("thread %d[%lu]...quit, exitcode: %d\n", i, tid[i], (long long)ret);//64位
//     }

//     // while (true)
//     // {
//     //      printf("main thread,pid: %d,tid:%lu\n",getpid(),pthread_self());
//     //     sleep(2);
//     // }
//     return 0;
// }

///////////////////////////////////////////////////////////////////////////////////////////////////

// // _ _thread : 修饰全局变量，带来的结果就是让每一个线程各自拥有一个全局的变量 -- 线程的局部存储
// __thread int g_val = 0;

// void *threadRoutine(void *args)
// {
//     // sleep(5);
//     //  execl("/bin/ls", "ls", nullptr);
//     while (true)
//     {
//         cout << (char *)args << " : " << g_val << " &: " << &g_val << endl;
//         g_val++;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void *)"thread 1");

//     while (true)
//     {
//         cout << "main thread :" << g_val << " &: " << &g_val << endl;
//         sleep(1);
//     }

//     return 0;
// }